home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / include / scsi / scsi_transport.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-12-24  |  3.9 KB  |  122 lines

  1. /* 
  2.  *  Transport specific attributes.
  3.  *
  4.  *  Copyright (c) 2003 Silicon Graphics, Inc.  All rights reserved.
  5.  *
  6.  *  This program is free software; you can redistribute it and/or modify
  7.  *  it under the terms of the GNU General Public License as published by
  8.  *  the Free Software Foundation; either version 2 of the License, or
  9.  *  (at your option) any later version.
  10.  *
  11.  *  This program is distributed in the hope that it will be useful,
  12.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  *  GNU General Public License for more details.
  15.  *
  16.  *  You should have received a copy of the GNU General Public License
  17.  *  along with this program; if not, write to the Free Software
  18.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  19.  */
  20. #ifndef SCSI_TRANSPORT_H
  21. #define SCSI_TRANSPORT_H
  22.  
  23. #include <linux/transport_class.h>
  24. #include <linux/blkdev.h>
  25. #include <scsi/scsi_host.h>
  26. #include <scsi/scsi_device.h>
  27.  
  28. struct scsi_transport_template {
  29.     /* the attribute containers */
  30.     struct transport_container host_attrs;
  31.     struct transport_container target_attrs;
  32.     struct transport_container device_attrs;
  33.  
  34.     /*
  35.      * If set, called from sysfs and legacy procfs rescanning code.
  36.      */
  37.     int (*user_scan)(struct Scsi_Host *, uint, uint, uint);
  38.  
  39.     /* The size of the specific transport attribute structure (a
  40.      * space of this size will be left at the end of the
  41.      * scsi_* structure */
  42.     int    device_size;
  43.     int    device_private_offset;
  44.     int    target_size;
  45.     int    target_private_offset;
  46.     int    host_size;
  47.     /* no private offset for the host; there's an alternative mechanism */
  48.  
  49.     /*
  50.      * True if the transport wants to use a host-based work-queue
  51.      */
  52.     unsigned int create_work_queue : 1;
  53.  
  54.     /*
  55.      * Allows a transport to override the default error handler.
  56.      */
  57.     void (* eh_strategy_handler)(struct Scsi_Host *);
  58.  
  59.     /*
  60.      * This is an optional routine that allows the transport to become
  61.      * involved when a scsi io timer fires. The return value tells the
  62.      * timer routine how to finish the io timeout handling:
  63.      * EH_HANDLED:        I fixed the error, please complete the command
  64.      * EH_RESET_TIMER:    I need more time, reset the timer and
  65.      *            begin counting again
  66.      * EH_NOT_HANDLED    Begin normal error recovery
  67.      */
  68.     enum blk_eh_timer_return (*eh_timed_out)(struct scsi_cmnd *);
  69.  
  70.     /*
  71.      * Used as callback for the completion of i_t_nexus request
  72.      * for target drivers.
  73.      */
  74.     int (* it_nexus_response)(struct Scsi_Host *, u64, int);
  75.  
  76.     /*
  77.      * Used as callback for the completion of task management
  78.      * request for target drivers.
  79.      */
  80.     int (* tsk_mgmt_response)(struct Scsi_Host *, u64, u64, int);
  81. };
  82.  
  83. #define transport_class_to_shost(tc) \
  84.     dev_to_shost((tc)->parent)
  85.  
  86.  
  87. /* Private area maintenance. The driver requested allocations come
  88.  * directly after the transport class allocations (if any).  The idea
  89.  * is that you *must* call these only once.  The code assumes that the
  90.  * initial values are the ones the transport specific code requires */
  91. static inline void
  92. scsi_transport_reserve_target(struct scsi_transport_template * t, int space)
  93. {
  94.     BUG_ON(t->target_private_offset != 0);
  95.     t->target_private_offset = ALIGN(t->target_size, sizeof(void *));
  96.     t->target_size = t->target_private_offset + space;
  97. }
  98. static inline void
  99. scsi_transport_reserve_device(struct scsi_transport_template * t, int space)
  100. {
  101.     BUG_ON(t->device_private_offset != 0);
  102.     t->device_private_offset = ALIGN(t->device_size, sizeof(void *));
  103.     t->device_size = t->device_private_offset + space;
  104. }
  105. static inline void *
  106. scsi_transport_target_data(struct scsi_target *starget)
  107. {
  108.     struct Scsi_Host *shost = dev_to_shost(&starget->dev);
  109.     return (u8 *)starget->starget_data
  110.         + shost->transportt->target_private_offset;
  111.  
  112. }
  113. static inline void *
  114. scsi_transport_device_data(struct scsi_device *sdev)
  115. {
  116.     struct Scsi_Host *shost = sdev->host;
  117.     return (u8 *)sdev->sdev_data
  118.         + shost->transportt->device_private_offset;
  119. }
  120.  
  121. #endif /* SCSI_TRANSPORT_H */
  122.